package main

import (
	"fmt"
	"os"
)

func main() {
	/*
		Go语言中，为了方便开发者使用，将 IO 操作封装在了如下几个包中：
			io 为 IO原语 提供基本的接口
			io 封装一些使用的 I/O 函数
			fmt 实现格式化 I/O
			bufio 实现带缓冲 I/O
		其中，io包 中提供了 I/O 原始操作的一系列接口。
		它主要包括了一些已有的实现，如 os包 中的那些，并将这些抽象成为实用性的功能和一些其他相关的接口。

		1.错误变量
			（1）var EOF = errors.New("EOF")
				正常输入结束 Read 返回 EOF，
				如果在一个结构化数据流中 EOF 在不期望的位置出现了，则应返回错误 ErrUnexpectedEOF 或者其它给出更多细节的错误。
			（2）var ErrClosedPipe = errors.New("io: read/write on closed pipe")
				当从一个已关闭的 Pipe 读取或者写入时，会返回 ErrClosedPipe。

			（3）var ErrNoProgress = errors.New("multiple Read calls return calls return no data or error")
				某些使用 io.Reader 接口的 客户端 如果多次调用 Read 都不返回数据也不返回错误时，就会返回本错误，一般来说是 io.Reader 的实现有问题的标志。

			（4）var ErrShortBuffer = errors.New("short buffer")
				ErrShortBuffer 表示读取操作需要大缓冲，但提供的缓冲不够大。

			（5）var ErrShortWrite = errors.New("short write")
				ErrShortWrite 表示写入操作写入的数据比提供的少，却没有显式的返回错误。

			（6）var ErrUnexpectedEOF = errors.New("unexpected EOF")
				ErrUnexpectedEOF 表示在读取一个固定尺寸的块或者数据结构时，在读取未完全时遇到了 EOF。

		2，基础接口
			（1）Reader 接口
				type Reader interface {
					Read(p []byte) (n int, err error)
				}
			Read 将 len§ 个字节读取到 p 中。它返回读取的字节数 n （0 <= n <= len§）以及任何遇到的错误。
			即使 Read 返回的 n < len§，它也会在调用过程中使用 p 的全部作为暂存空间。
			若一些数据可用但不到 len§ 个字节，Read 会照例返回可用的东西，而不是等待更多。

			当 Read 在成功读取 n > 0 个字节后遇到一个错误或 EOF 情况，它就会返回读取的字节数。
			它会从相同的调用中返回（非nil的）错误或随后的调用中返回错误（和 n == 0）
			这种一般情况的一个例子就是 Reader 在输入流结束时会返回一个非零的字节数，可能返回的不是 err == EOF 就是 err == nil。无论如何，下一个 Read 都应当返回 0, EOF。

			调用者应当总在考虑到错误 err 前处理 n > 0 的字节。这样做可以读取一些字节，以及允许的 EOF 行为后正确地处理 I/O 错误。

			Read 的实现会阻止返回零字节的计数和一个 nil 错误，调用者应将这种情况视作空操作。

			（2）

	*/
	fmt.Println("---------------------------------Reader--------------------------------")
	f, err := os.Open("a.txt")
	if err != nil {
		fmt.Printf("err: %v\n", err)
		return
	}
	defer f.Close()

	//buf := make([]byte, 12)
}
